﻿package main

import "fmt"


// 函数也是一种类型，下面用type做一个类型定义
// type关键字，什么要做定义
// add_func，定义的名字是add_func
// func，函数也是一种类型，所以要定义的类型是函数
// 后面是这个函数类型的参数类型和返回值类型
type add_func func(int, int) int

// 写一个函数，函数的类型和上面的自定义类型一样
func add(a, b int) int {
    return a + b
}

// 再写一个减法的吧
func sub(a, b int) int {
    return a - b
}

// 在写一个函数，第一个参数是函数类型
// 后面的参数是要用来给参数1的函数进行计算的
func operator(op add_func, a, b int) int {
    return op(a, b)
}

// 主函数
func main() {
    // 第一个变量add，是一个函数
    sum := operator(add, 10, 20)
    fmt.Println(sum)

    var (
        c add_func
        res int
    )
    // 函数也可以赋值给变量
    c = add
    res = operator(c, 110, 40)
    fmt.Println(res)
    c = sub
    // 这次调用方法不变，但是变量c变量，换了一个函数进行计算
    res = operator(c, 110, 40)
    fmt.Println(res)
}